( fig-FORTH PORTABLE EDITOR WFR 01 MAY 79 ) FORTH DEFINITIONS HEX : TEXT HERE C/L 1+ BLANKS WORD HERE PAD C/L 1+ CMOVE ; : LINE DUP FFF0 AND 17 ?ERROR SCR @ (LINE) DROP ; VOCABULARY EDITOR IMMEDIATE HEX : WHERE ( PRINT SCREEN # AND IMAGE OF ERROR ) DUP B/SCR / DUP SCR ! ." Screen # " DECIMAL . SWAP C/L /MOD C/L * ROT BLOCK + CR C/L TYPE CR HERE C@ - SPACES 5E EMIT [COMPILE] EDITOR QUIT ; EDITOR DEFINITIONS : #LOCATE R# @ C/L /MOD ; : #LEAD #LOCATE LINE SWAP ; : #LAG #LEAD DUP >R + C/L R> - ; : -MOVE LINE C/L CMOVE UPDATE ; --> ( fig-FORTH PORTABLE EDITOR, continued ) : H LINE PAD 1+ C/L DUP PAD C! CMOVE ; : E LINE C/L BLANKS UPDATE ; : S DUP 1 - 0E DO I LINE I 1+ -MOVE -1 +LOOP E ; : D DUP H 0F DUP ROT DO I 1+ LINE I -MOVE LOOP E ; : M R# +! CR SPACE #LEAD TYPE 5F EMIT #LAG TYPE #LOCATE . DROP ; : T DUP C/L * R# ! DUP H 0 M ; : L SCR @ LIST 0 M ; --> ( fig-FORTH PORTABLE EDITOR, continued ) : R PAD 1+ SWAP -MOVE ; : P 1 TEXT R ; : I DUP S R ; : TOP 0 R# ! ; : CLEAR SCR ! 10 0 DO FORTH I EDITOR E LOOP ; : COPY B/SCR * SWAP B/SCR * B/SCR OVER + SWAP DO DUP FORTH I BLOCK 2 - ! 1+ UPDATE LOOP DROP FLUSH ; --> ( fig-FORTH PORTABLE EDITOR, continued ) : 1LINE ( scan line with cursor for match to PAD text ) ( update cursor, return boolean ) #LAG PAD COUNT MATCH R# +! ; : FIND ( string at PAD over full screen, else error ) BEGIN 3FF R# @ < IF TOP PAD HERE C/L 1+ CMOVE 0 ERROR ENDIF 1LINE UNTIL ; : DELETE ( backwards at cursor by count-1 ) >R #LAG + FORTH R - ( save blank fill location ) #LAG R MINUS R# +! ( backup cursor ) #LEAD + SWAP CMOVE R> BLANKS UPDATE ; ( fill from end ) : N ( find next occurence of previous text ) FIND 0 M ; : F ( find occurence of text ) 1 TEXT N ; --> ( fig-FORTH PORTABLE EDITOR, continued ) : B ( BACKUP CURSOR BY TEXT IN PAD ) PAD C@ MINUS M ; : X ( delete following text ) 1 TEXT FIND PAD C@ DELETE 0 M ; : TILL ( delete from cursor to text end on this line ) #LEAD + 1 TEXT 1LINE 0= 0 ?ERROR #LEAD + SWAP - DELETE 0 M ; : C ( spread at cursor and copy in following text ) 1 TEXT PAD COUNT #LAG ROT OVER MIN >R FORTH R R# +! R - >R DUP HERE R CMOVE HERE #LEAD + R> CMOVE R> CMOVE UPDATE 0 M ; FORTH DEFINITIONS DECIMAL LATEST 12 +ORIGIN ! ( TOP NFA ) HERE 28 +ORIGIN ! ( FENCE ) HERE 30 +ORIGIN ! ( DP ) ' EDITOR 6 + 32 +ORIGIN ! ( VOC-LINK ) HERE FENCE ! ;S